/**
 * 服务访问权限中间件
 * 检查用户是否有足够的代币访问特定服务
 */

const Visitor = require('../models/Visitor');
const UserBenefit = require('../models/UserBenefit');
const { ServiceTokenCost } = require('../config/pricing');

/**
 * 检查用户是否有权访问特定服务
 * @param {string} serviceType 服务类型('text', 'img', 'voice', 'video')
 * @param {boolean} requireMembership 是否要求用户必须是会员
 */
const checkServiceAccess = (serviceType, requireMembership = false) => {
  return async (req, res, next) => {
    const user_uuid = req.body.user_uuid || req.query.user_uuid;

    if (!user_uuid) {
      return res.status(401).json({ 
        error: "未授权访问", 
        redirect: "/login" 
      });
    }

    try {
      // 获取用户信息
      const visitor = await Visitor.findOne({
        where: { uuid: user_uuid }
      });

      if (!visitor) {
        return res.status(404).json({ 
          error: "用户不存在", 
          redirect: "/login" 
        });
      }

      // 检查会员状态
      const now = new Date();
      const isMember = visitor.membership_expires_at && visitor.membership_expires_at > now;

      // 如果要求用户必须是会员，但用户不是会员
      if (requireMembership && !isMember) {
        // 返回会员购买页面
        return res.status(403).json({
          error: "需要会员权限",
          is_member: false,
          redirect: "/subscription",
        });
      }

      // 获取服务所需代币
      const requiredTokens = ServiceTokenCost[serviceType] || 0;

      // 检查代币余额
      if (visitor.tokens_balance < requiredTokens) {
        return res.status(403).json({
          error: "代币余额不足",
          current_balance: visitor.tokens_balance,
          required: requiredTokens,
          is_member: isMember,
          redirect: "/tokens",
        });
      }

      // 如果一切正常，则通过中间件并附加用户信息
      req.visitor = visitor;
      req.isMember = isMember;

      // 获取会员等级信息（如果是会员）
      if (isMember) {
        const userBenefit = await UserBenefit.findOne({
          where: { user_uuid: user_uuid }
        });
        req.membershipTier = userBenefit ? userBenefit.membership_tier : null;
      } else {
        req.membershipTier = null;
      }

      next();
    } catch (err) {
      console.error("检查服务访问权限失败:", err.message);
      res.status(500).json({ error: "服务器内部错误" });
    }
  };
};

module.exports = checkServiceAccess; 